#include <iostream>
#include <unistd.h>
#include <vector>
#include <signal.h>

#define BLOCK_SIGNO 2

void show_pending(const sigset_t &pending)
{
    for (int signo = 31; signo >= 1; signo--)
    {
        if (sigismember(&pending, signo))
            std::cout << "1";
        else
            std::cout << "0";
    }
    std::cout << "\n";
}

static void handler(int signo)
{
    std::cout << signo << " 号信号已经被递达" << std::endl;
}

int main()
{
    signal(BLOCK_SIGNO, handler);
    // 1.先尝试屏蔽指定信号
    sigset_t block, oblock, pending;

    // 1.1 初始化
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigemptyset(&pending);

    // 1.2 添加要屏蔽的信号
    sigaddset(&block, BLOCK_SIGNO);
    // 1.3 开始屏蔽
    sigprocmask(SIG_SETMASK, &block, &oblock);

    // 2.遍历打印pending信号集
    int cnt = 10;
    while (true)
    {
        // 2.1初始化
        sigemptyset(&pending);
        // 2.2获取它
        sigpending(&pending);
        // 2.3打印它
        show_pending(pending);
        sleep(1);

        if (cnt-- == 0)
        {
            sigprocmask(SIG_SETMASK, &oblock, &block);
            std::cout << "恢复对信号的屏蔽，不屏蔽任何信号" << std::endl;
        }
    }
}

// #include <iostream>
// #include <cstdio>
// #include <unistd.h>
// #include <signal.h>

// void Count(int cnt)
// {
//     while(cnt)
//     {
//         printf("cnt: %2d\r", cnt);
//         fflush(stdout);
//         cnt--;
//         sleep(1);
//     }
//     printf("\n");
// }

// void handler(int signo)
// {
//     std::cout << "get a signo: " << signo << "正在处理中..." << std::endl;
//     Count(20);
// }

// int main()
// {
//     struct sigaction act, oact;
//     act.sa_handler = handler;
//     act.sa_flags = 0;
//     // 当我们正在处理某一种信号的时候，我们也想顺便屏蔽其他信号，就可以添加到这个sa_mask中
//     sigemptyset(&act.sa_mask);
//     // sigaddset(&act.sa_mask, 3);
//     sigaction(SIGINT, &act, &oact);

//     while (true)
//         sleep(1);
//     return 0;
// }

// #include <stdio.h>
// #include <unistd.h>
// #include <signal.h>

// volatile quit = 0;

// void handler(int signo)
// {
//     printf("%d 号信号,正在被捕捉!\n",signo);
//     printf("quit: %d", quit);
//     quit = 1;
//     printf("->%d\n", quit);
// }

// int main()
// {
//     signal(2, handler);
//     while (!quit);
//     printf("注意,我是正常退出的\n");
//     return 0;
// }

// #include <iostream>
// #include <unistd.h>
// #include <fcntl.h>

// void SetNonBlock(int fd)
// {
//     int fl = fcntl(fd, F_GETFL);
//     if (fl < 0)
//     {
//         perror("fcntl");
//         return;
//     }
//     fcntl(fd, F_SETFL, fl | O_NONBLOCK);
// }

// int main()
// {
//     SetNonBlock(0);
//     while (true)
//     {
//         char buffer[1024];
//         ssize_t s = read(0, buffer, sizeof(buffer) - 1);
//         if (s > 0)
//         {
//             std::cout << buffer << std::endl;
//         }
//         else
//         {
//             perror("read");
//             sleep(1);
//             continue;
//         }
//     }
//     return 0;
// }